﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
//!：逻辑取反运算符（改变单个表达式的真假）
//
//&& ：与运算符，就是并且的意思（两侧的表达式都为真，则为真，否则为假）
//
//|| ：或运算符，就是或者的意思（两侧⾄少有⼀个表达式为真，则为真，否则为假）

//int main()
//{
//	int example = 0;
//	if (example)
//	{
//		printf("hello\n");
//	}
//	if (!example)
//	{
//		printf("world!\n");
//	}
//	return 0;
//}
//&& 就是与运算符，也是并且的意思，&& 是⼀个双⽬操作符，使⽤的⽅式是a&& b，
//&& 两边的表达式都是真的时候，整个表达式才为真，只要有⼀个是假，则整个表达式为假。

//int main()
//{
//	if ((2 > 1) && (3 > 2))
//	{
//		printf("hello\n");
//	}
//	if ((2 < 1) && (3 > 2))//只要有一边为假，那么整个与语句就会为假
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}
// 
// 
//|| 就是或运算符，也就是或者的意思， || 也是⼀个双⽬操作符，使⽤的⽅式是
//a || b ， || 两边的表达式只要有⼀个是真，整个表达式就是真，两边的表达式都为假的时候，才为假。
// 
// 
//int main()
//{
//	if ((2 < 1) || (3 > 2))
//	{
//		printf("hello\n");
//	}
//	if ((2 < 1) || (3 < 2))//只有两边同时为假，||表达式才为假
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}

//值得一提的是，C语⾔逻辑运算符还有⼀个特点，它总是先对左侧的表达式求值，再对右边的表达式求值。
//
//如果左边的表达式满⾜逻辑运算符的条件，就不再对右边的表达式求值。这种情况称为“短路”。


//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	i = a++ && ++b && d++;
//	printf("a = %d\n b = %d\n c = %d\nd = %d\ni=%d\n", a, b, c, d, i);
//	return 0;
//}

//i为什么等于0呢？b和d的值为什么没有发生变化呢？
//
//原因就在于&& 发生了短路。
//
//a++代表先使用a，再对a加1，那么对于 && 语句来说，a就是0，有0即全部为假，所以后面的++b，d++都不会再执行了，
//所以a的值变成了1，b和d还是2, 4。整个语句为假，那么返回的就是0，因此i也等于0

int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = ++a && ++b && d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\ni=%d\n", a, b, c, d, i);
	return 0;
}